<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>重构字符串</title>
</head>

<body>
  <script>
    function fn(S) {
      let arr = new Array(26).fill({ key: null, num: 0 });
      let max = 0;
      //按照字典去找到每个字母的数
      for (let v of S) {
        arr[v.charCodeAt() - 97] = { key: v, num: arr[v.charCodeAt() - 97].num + 1 }
      }
      //排序一下
      arr.sort((a, b) => a.num - b.num);
      //先拿出来最多的
      let temp = arr.pop();
      //如果最多的比整体的一半都多肯定是不行的
      if (temp.num > Math.ceil(S.length / 2)) return '';
      //构造一个基础的数组
      let res = new Array(temp.num).fill(temp.key), i = 0;
      while (arr.length) {
        //依次拿出字母
        let next = arr.pop();
        //如果没填满字典，拿到了没有的，说明后面的都是空，就直接推出循环，
        if (next.key == null) break;
        //从这里开始隔位插空
        for (i; i <= res.length; i++) {
          //如果i走到了res的最后一位还多一位，说明这时候走完了res，这时候next的字母必定没走完，正好走完的情况在下面被剔除了，然后从头开始继续插入
          if (i == res.length) {
            i = 0;
          };
          //插入字母
          res.splice(i + 1, 0, next.key);
          //i跳过插入的字母，next的数量-1
          i++; next.num--;
          //如果next走完了把i跳到后面原本的字母上，跳出循环
          if (next.num <= 0) {
            i++; break;
          }
        }
      }
      return res.join('')
    }
    console.log(fn('aab'))
  </script>
</body>

</html>